package com.itheima.service;

import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.dao.RoleDao;
import com.itheima.entity.PageResult;
import com.itheima.entity.QueryPageBean;
import com.itheima.pojo.Role;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
public class RoleServiceImpl implements RoleService {

    @Autowired
    RoleDao roleDao;

    /**
     * 角色管理-新增角色
     *
     * @param role
     * @param permissionIds
     * @param menuIds
     */
    @Override
    public void save(Role role, Integer[] permissionIds, Integer[] menuIds) {
        roleDao.save(role);

        if (role.getId() != null && permissionIds != null && permissionIds.length > 0 && menuIds != null && menuIds.length > 0) {
            for (Integer permissionId : permissionIds) {
                roleDao.setPermission(role.getId(), permissionId);
            }
            for (Integer menuId : menuIds) {
                roleDao.setMenu(role.getId(), menuId);
            }
        }
    }

    /**
     * 角色管理-分页查询
     *
     * @param queryPageBean
     * @return
     */
    @Override
    public PageResult findPage(QueryPageBean queryPageBean) {
        PageHelper.startPage(queryPageBean.getCurrentPage(), queryPageBean.getPageSize());

        Page<Role> page = roleDao.findPage();

        return new PageResult(page.getTotal(), page);
    }

    /**
     * 角色管理-编辑回显基本信息
     *
     * @param id
     * @return
     */
    @Override
    public Role findById(Integer id) {
        return roleDao.findById(id);
    }

    /**
     * 编辑回显被关联的权限
     *
     * @param id
     * @return
     */
    @Override
    public Integer[] findPermissionIdsById(Integer id) {
        return roleDao.findPermissionIdsById(id);
    }

    /**
     * 编辑回显被关联的菜单
     *
     * @param id
     * @return
     */
    @Override
    public Integer[] findMenuIdsById(Integer id) {
        return roleDao.findMenuIdsById(id);
    }

    /**
     * 角色管理-编辑角色
     *
     * @param role
     * @param permissionIds
     * @param menuIds
     */
    @Override
    @Transactional
    public void edit(Role role, Integer[] permissionIds, Integer[] menuIds) {
        roleDao.edit(role);
        //清除原来的关系
        roleDao.delPermissionRelation(role.getId());
        roleDao.delMenuRelation(role.getId());
        //再维护新关系
        if (role.getId()!=null && permissionIds != null && permissionIds.length > 0  ) {
            for (Integer permissionId : permissionIds) {
                roleDao.setPermission(role.getId(), permissionId);
            }

        }

        if (role.getId()!=null && menuIds != null && menuIds.length > 0) {
            for (Integer menuId : menuIds) {
                roleDao.setMenu(role.getId(), menuId);
            }
        }
    }

    /**
     * 删除角色
     * @param id
     */
    @Override
    public void delById(Integer id) {

        long count=roleDao.queryUserRelation(id);

        if (count>0) {
            throw new RuntimeException("角色表被用户表关联了，不可以删除");
        }

        roleDao.delPermissionRelation(id);
        roleDao.delMenuRelation(id);

        roleDao.delById(id);
    }

    @Override
    public List<Role> findAll() {
        return roleDao.findAll();
    }
}
